package org.teach.study.boot.dao;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Mapper;
import org.quincy.rock.core.vo.Sort;
import org.teach.study.boot.Dao;
import org.teach.study.boot.entity.Photo;
import org.teach.study.boot.entity.User;

/**
 * <b>用户Dao接口。</b>
 * <p><b>详细说明：</b></p>
 * <!-- 在此添加详细说明 -->
 * 无。
 * 
 * @version 1.0
 * @author mex2000
 * @since 1.0
 */
@Mapper
public interface UserDao extends Dao<User> {

	/**
	 * <b>组合条件查询。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param condition 组合条件Map
	 * @param sort 排序规则，允许null
	 * @param offset 开始位移(从0开始)
	 * @param pageSize 页大小
	 * @return 一页数据列表
	 */
	public List<User> findPageByCondition(Map<String, Object> condition, Sort sort, long offset, int pageSize);

	/**
	 * <b>查询满足组合查询条件的记录数。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param condition 组合条件Map
	 * @return 满足组合查询条件的记录数
	 */
	public long countByCondition(Map<String, Object> condition);

	/**
	 * <b>获得照片。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 返回的照片数据存放在二进制数组里。
	 * @param id 主键id
	 * @return Photo
	 */
	public Photo getPhoto(long id);

	/**
	 * <b>更新照片。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param photo 照片实体对象
	 * @return 更新数据条数
	 */
	public int updatePhoto(Photo photo);

	/**
	 * <b>更新个人信息。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 根据用户id更新用户信息，值对象的id必须有效。
	 * 可以修改自己少部分个人信息。
	 * @param vo　个人用户信息
	 * @return　更新数据条数
	 */
	public int updateSelfInfo(User vo);

	/**
	 * <b>根据用户名密码获得合法用户。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param code 用户代码
	 * @param password 加密后的密码
	 * @return 如果成功返回该用户，否则返回null
	 */
	public User findValidUser(String code, String password);

	/**
	 * <b>用户修改自己的密码。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 无。
	 * @param code 用户登录名
	 * @param oldPassword 加密后的旧密码
	 * @param newPassword 加密后的新密码
	 * @return 更新数据条数
	 */
	public int changeSelfPassword(String code, String oldPassword, String newPassword);

	/**
	 * <b>系统管理员修改密码。</b>
	 * <p><b>详细说明：</b></p>
	 * <!-- 在此添加详细说明 -->
	 * 系统管理员可以修改任何人的密码而无需旧密码。
	 * 调用此方法修改密码前，请确保该用户具有系统管理员权限
	 * @param code 用户登录名
	 * @param newPassword 加密后的新密码
	 * @return 更新数据条数
	 */
	public int changePassword(String code, String newPassword);
}
